import random
import time

import numpy as np
import pandas as pd
import requests
from PIL.Image import Image
from lxml import etree
from matplotlib import pyplot as plt
from pyecharts.charts import WordCloud


def spider():
    url = 'https://accounts.douban.com/j/mobile/login/basic'
    headers = {

        "User-Agent": 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)'}
    #龙岭迷窟网址，为了动态翻页，start 后加了格式化数字，短评页面有 20 条数据，每页增加 20 条
    url_comment = 'https://movie.douban.com/subject/30488569/comments?start=%d&limit=20&sort=new_score&status=P'
    data = {


        'ck': '',
        'name': '自己的用户名',
        'password': '自己的密码',
        'remember': 'false',
        'ticket': ''
    }
    session = requests.session()
    session.post(url=url, headers=headers, data=data)
    #初始化 4 个 list 分别存用户名、评星、时间、评论文字
    users = []
    stars = []
    times = []
    content = []
    #抓取 500 条，每页 20 条，这也是豆瓣给的上限
    for i in range(0, 500, 20):
        #获取 HTML
        data = session.get(url_comment % i, headers=headers)
        #状态码 200 表是成功
        print('第', i, '页', '状态码：',data.status_code)
        #暂停 0-1 秒时间，防止IP被封
        time.sleep(random.random())
        #解析 HTML
        selector = etree.HTML(data.text)
        #用 xpath 获取单页所有评论
        comments = selector.xpath('//div[@class="comment"]')
        #遍历所有评论，获取详细信息
        for comment in comments:
            #获取用户名
            user = comment.xpath('.//h3/span[2]/a/text()')[0]
            # 获取评星
            star = comment.xpath('.//h3/span[2]/span[2]/@class')[0][7:8]
            #获取时间
            date_time = comment.xpath('.//h3/span[2]/span[3]/@title')
            #有的时间为空，需要判断下
            if len(date_time) != 0:
                date_time = date_time[0]
                date_time = date_time[:10]
            else:
                date_time = None
            #获取评论文字
            comment_text = comment.xpath('.//p/span/text()')[0].strip()
            #添加所有信息到列表
            users.append(user)
            stars.append(star)
            times.append(date_time)
            content.append(comment_text)
    #用字典包装
    comment_dic = {

        'user': users, 'star': stars, 'time': times, 'comments': content}
    #转换成 DataFrame 格式
    comment_df = pd.DataFrame(comment_dic)
    #保存数据
    comment_df.to_csv('data.csv')
    #将评论单独再保存下来
    comment_df['comments'].to_csv('comment.csv', index=False)

# 分析评论
def analyze():
    csv_data = pd.read_csv('data.csv')
    df = pd.DataFrame(csv_data)
    df_gp = df.groupby(['time']).size()
    values = df_gp.values.tolist()
    index = df_gp.index.tolist()
    # 设置画布大小
    plt.figure(figsize=(8, 5))
    # 数据
    plt.plot(index, values, label='评论数')
    # 设置数字标签
    for a, b in zip(index, values):
        plt.text(a, b, b, ha='center', va='bottom', fontsize=13, color='black')
    plt.title('评论数量随时间变化折线图')
    plt.tick_params(labelsize=10)
    plt.ylim(0, 300)
    plt.legend(loc='upper right')
    plt.show()

def rule_data():
    csv_data = pd.read_csv('data.csv')
    roles = {

        '胡八一':0, '王胖子':0, '雪莉杨':0, '鹧鸪哨':0, '大金牙':0, '陈瞎子':0}
    names = list(roles.keys())
    for name in names:
        jieba.add_word(name)
    for row in csv_data['comments']:
        row = str(row)
        for name in names:
            count = row.count(name)
            roles[name] += count
    plt.figure(figsize=(8, 5))
    # 数据
    plt.bar(list(roles.keys()), list(roles.values()), width=0.5, label='提及次数', color=['r', 'dodgerblue', 'c', 'm', 'y', 'g'])
    # 设置数字标签
    for a, b in zip(list(roles.keys()), list(roles.values())):
        plt.text(a, b, b, ha='center', va='bottom', fontsize=13, color='black')
    plt.title('角色被提及次数柱状图')
    plt.xticks(rotation=270)
    plt.tick_params(labelsize=10)
    plt.ylim(0, 200)
    plt.legend(loc='upper right')
    plt.show()


def jieba_():
    #打开评论数据文件
    content = open('comment.csv', 'rb').read()
    #jieba 分词
    word_list = jieba.cut(content)
    words = []
    #过滤掉的词
    remove_words = ['以及', '不会', '一些', '那个', '只有',
                    '不过', '东西', '这个', '所有', '这么',
                    '但是', '全片', '一点', '一部', '一个',
                    '什么', '虽然', '一切', '样子', '一样',
                    '只能', '不是', '一种', '这个', '为了']
    for word in word_list:
        if word not in remove_words:
            words.append(word)
    global word_cloud
    #用逗号隔开词语
    word_cloud = '，'.join(words)

def cloud():
    #打开词云背景图
    cloud_mask = np.array(Image.open('bg.jpg'))
    #定义词云的一些属性
    wc = WordCloud(
        #背景图分割颜色为白色
    background_color='white',
    #背景图样
    mask=cloud_mask,
    #显示最大词数
    max_words=100,
    #显示中文
    font_path='./fonts/simhei.ttf',
    #最大尺寸
    max_font_size=80
    )
    global word_cloud
    #词云函数
    x = wc.generate(word_cloud)
    #生成词云图片
    image = x.to_image()
    #展示词云图片
    image.show()
    #保存词云图片
    wc.to_file('anjia.png')


if __name__ == '__main__':
    #spide1 = spider()
    analyze()
    print("OK")